import moment from "moment";


const FMT_MONTH = "YYYY-MM";
const FMT_DATE = "YYYY-MM-DD";
const FMT_DATE_TIME = "YYYY-MM-DD HH:mm:ss";
const FMT_TIME = "HH:mm:ss";

/**
 * 返回monent
 * @returns {moment.Moment}
 */
function getMoment() {
    return moment();
}

/**
 * 时间格式化
 * @param date 日期
 * @param formatType 格式化字符串
 * @returns {string}
 */
function format(date = new Date(), formatType = FMT_DATE) {
    return moment(date).format(formatType);
}

/**
 * 时间格式化
 * @param date
 * @returns {string}
 */
function formatMonth(date = new Date(), formatType = FMT_MONTH) {
    return format(date, formatType);
}

/**
 * 时间格式化
 * @param date 日期
 * @returns {string} YYYY-MM-DD
 */
function formatDate(date = new Date(), formatType = FMT_DATE) {
    return format(date, formatType);
}

/**
 * 时间格式化
 * @param date
 * @returns {string}
 */
function formatDateTime(date = new Date(), formatType = FMT_DATE_TIME) {
    return format(date, formatType);
}

/**
 * 时间格式化
 * @param date
 * @returns {string}
 */
function formatTime(date = new Date(), formatType = FMT_TIME) {
    return format(date, formatType);
}

/**
 * 时间格式化
 * @param date
 * @returns {Date}
 */
function getDateBegin(date = new Date()) {
    return moment(date).hour(0).minutes(0).seconds(0).toDate();

}

/**
 * 时间格式化
 * @param date
 * @returns {string}
 */
function getDateBeginStr(date = new Date(), formatType = FMT_DATE_TIME) {
    return moment(date).hour(0).minutes(0).seconds(0).format(formatType)
}

/**
 * 时间格式化
 * @param date
 * @returns {Date}
 */
function getDateEnd(date = new Date()) {
    return moment(date).hour(23).minutes(59).seconds(59).toDate();
}

/**
 * 时间格式化
 * @param date
 * @returns {string}
 */
function getDateEndStr(date = new Date(), formatType = FMT_DATE_TIME) {
    return moment(date).hour(23).minutes(59).seconds(59).format(formatType)
}

/**
 * 时间格式化
 * @param date
 * @returns {Date}
 */
function getMonthBegin(date = new Date()) {
    return moment(date).startOf('month').toDate()
}

/**
 * 时间格式化
 * @param date
 * @returns {string}
 */
function getMonthBeginStr(date = new Date(), formatType = FMT_DATE) {
    return moment(date).startOf('month').format(formatType)
}

/**
 * 时间格式化
 * @param date
 * @returns {Date}
 */
function getMonthEnd(date = new Date()) {
    return moment(date).endOf('month').toDate()
}

/**
 * 时间格式化
 * @param date
 * @returns {string}
 */
function getMonthEndStr(date = new Date(), formatType = FMT_DATE) {
    return moment(date).endOf('month').format(formatType)
}

/**
 * 获取日期列表
 * @param startDate
 * @param endDate
 * @returns {*[]}
 */
function getDateList(startDate = new Date(), endDate = new Date()) {
    let start = moment(startDate).hour(0).minutes(0).seconds(0);
    let end = moment(endDate).hour(0).minutes(0).seconds(0);
    let dateArr = [];
    do {
        dateArr.push(start.toDate());
        start.add(1, "d");
    } while (start.isSameOrBefore(end));
    return dateArr;
}

/**
 * 获取日期列表
 * @param startDate
 * @param endDate
 * @returns {*[]}
 */
function getDateStrList(startDate = new Date(), endDate = new Date()) {
    let start = moment(startDate).hour(0).minutes(0).seconds(0);
    let end = moment(endDate).hour(0).minutes(0).seconds(0);
    let dateArr = [];
    do {
        dateArr.push(start.format(FMT_DATE));
        start.add(1, "d");
    } while (start.isSameOrBefore(end));
    return dateArr;
}

/**
 * 时间解析
 * @param dateStr
 * @param formatType
 * @returns {Date}
 */
function parse(dateStr = new Date(), formatType) {
    return moment(dateStr, formatType).toDate();
}

/**
 * 时间解析
 * @param dateStr
 * @returns {Date}
 */
function parseMonth(dateStr = new Date(), formatType = FMT_MONTH) {
    return parse(dateStr, formatType);
}

/**
 * 时间解析
 * @param dateStr
 * @returns {Date}
 */
function parseDate(dateStr = new Date(), formatType = FMT_DATE) {
    return parse(dateStr, formatType);
}

/**
 * 时间解析
 * @param dateStr
 * @returns {Date}
 */
function parseDateTime(dateStr = new Date(), formatType = FMT_DATE_TIME) {
    return parse(dateStr, formatType);
}

/**
 * 时间解析
 * @param dateStr
 * @returns {Date}
 */
function parseTime(dateStr = new Date(), formatType = FMT_TIME) {
    return parse(dateStr, formatType);
}

/**
 * 增加年
 * @param date
 * @param years
 * @returns {Date}
 */
function addYears(date = new Date(), years) {
    return moment(date).add(years, "y").toDate();
}

/**
 * 增加月份
 * @param date
 * @param months
 * @returns {Date}
 */
function addMonths(date = new Date(), months) {
    return moment(date).add(months, "M").toDate();
}

/**
 * 增加星期
 * @param date
 * @param weeks
 * @returns {Date}
 */
function addWeeks(date = new Date(), weeks) {
    return moment(date).add(weeks, "w").toDate();
}

/**
 * 增加天数
 * @param date
 * @param days
 * @returns {Date}
 */
function addDays(date = new Date(), days) {
    return moment(date).add(days, "d").toDate();
}

/**
 * 增加小时数
 * @param date
 * @param hours
 * @returns {Date}
 */
function addHours(date = new Date(), hours) {
    return moment(date).add(hours, "h").toDate();
}

/**
 * 增加分钟数
 * @param date
 * @param minutes
 * @returns {Date}
 */
function addMinutes(date = new Date(), minutes) {
    return moment(date).add(minutes, "m").toDate();
}

/**
 *  增加秒数
 * @param date
 * @param seconds
 * @returns {Date}
 */
function addSeconds(date = new Date(), seconds) {
    return moment(date).add(seconds, "s").toDate();
}

/**
 * 比较日期
 * @param date1
 * @param date2
 * @returns {boolean}
 */
function isBefore(date1 = new Date(), date2 = new Date()) {
    return moment(date1).isBefore(date2);
}

/**
 * 比较日期
 * @param date1
 * @param date2
 * @returns {boolean}
 */
function isAfter(date1 = new Date(), date2 = new Date()) {
    return moment(date1).isAfter(date2);
}

/**
 * 比较日期
 * @param date1
 * @param date2
 * @returns {boolean}
 */
function isSame(date1 = new Date(), date2 = new Date()) {
    return moment(date1).isSame(date2);
}

export {
    FMT_MONTH,
    FMT_DATE,
    FMT_DATE_TIME,
    FMT_TIME,
    getMoment,
    format,
    formatMonth,
    formatDate,
    formatDateTime,
    formatTime,
    getDateBegin,
    getDateEnd,
    getDateBeginStr,
    getDateEndStr,
    getMonthBegin,
    getMonthEnd,
    getMonthBeginStr,
    getMonthEndStr,
    getDateList,
    getDateStrList,
    parse,
    parseMonth,
    parseDate,
    parseDateTime,
    parseTime,
    addYears,
    addMonths,
    addWeeks,
    addDays,
    addHours,
    addMinutes,
    addSeconds,
    isBefore,
    isAfter,
    isSame
}
